//////////////////////////////////////////////////////////////////////////////
// ¡¡ATENCIÓN!!
// Parte de este fichero ha sido autogenerado por Rosette. Utiliza las
// regiones dispuestas por en el fichero para escribir el código necesario
// Todo lo que esté fuera de esas regiones será borrado en nuevas generaciones.
// ¡¡ATENCIÓN!!
//////////////////////////////////////////////////////////////////////////////
/**
@file MovementComponent.cpp

Fichero generado por Rosette para la implementación del componente MovementComponent

@author Rosette
*/

#include "MovementComponent.h"

#include "Logic/Entity/Entity.h"
#include "Logic/Maps/Map.h"
#include "Map/MapEntity.h"

// En esta región es donde se deben realizar las inclusiones de ficheros.
#pragma region UserImpInclusions

#pragma endregion UserImpInclusions

namespace Logic {
	IMP_FACTORY(MovementComponent);

	//---------------------------------------------------------

// Los métodos de esta región no se deben modificar ya que serán reescritos
// en futuras generaciones de código
#pragma region UneditableMethods

	bool MovementComponent::spawn(CEntity *entity, CMap *map, const Map::CEntity *entityInfo) {
		if(!Component::spawn(entity, map, entityInfo)) {
			return false;
		}

		// get speed multiplier
		if(entityInfo->hasAttribute("speedMultiplier")) {
			_speedMultiplier = entityInfo->getFloatAttribute("speedMultiplier");
		}

		// get speed vector
		if(entityInfo->hasAttribute("speedVector")) {
			_speedVector = entityInfo->getVector3Attribute("speedVector");
		}

		return onSpawn();

	} // spawn

	//---------------------------------------------------------

	bool MovementComponent::accept(const TMessage &message) {
		return message._type == Message::MOVE;
	} // accept

	//---------------------------------------------------------

	void MovementComponent::process(const TMessage &message) {
		Component::process(message);
		switch(message._type)
		{
		case Message::MOVE: MOVE(message._direction, message._clearMovement); break;
		}
	} // process

	//---------------------------------------------------------

#pragma endregion UneditableMethods

// Los métodos de esta región se corresponden al ciclo de vida y a las
// acciones y eventos del componente. Se deben rellenar sus cuerpos pero no
// cambiar la declaración. Eso se debe hacer en Rosette.
#pragma region AutogeneratedMethods

#pragma region 5
	MovementComponent::~MovementComponent() {

	} // ~MovementComponent
#pragma endregion 5

	//---------------------------------------------------------

#pragma region 1
	bool MovementComponent::onSpawn() {
		return true;

	} // onSpawn
#pragma endregion 1

	//---------------------------------------------------------

#pragma region 2
	bool MovementComponent::activate() {
		return true;

	} // activate
#pragma endregion 2

	//---------------------------------------------------------

#pragma region 3
	void MovementComponent::deactivate() {

	} // deactivate
#pragma endregion 3

	//---------------------------------------------------------

#pragma region 4
	void MovementComponent::tick(unsigned int msecs) {
		Component::tick(msecs);

		Vector3 newPosition = _entity->getPosition();
		newPosition.x += _speedVector.x * _speedMultiplier * msecs;
		newPosition.y += _speedVector.y * _speedMultiplier * msecs;

		_entity->setPosition(newPosition);
	} // tick
#pragma endregion 4

	//---------------------------------------------------------

#pragma region 1037
	void MovementComponent::MOVE(Vector3 direction, bool clearMovement) {
		if(clearMovement) {
			_speedVector = direction;
		} else {
			_speedVector += direction;
		}
	}
#pragma endregion 1037

	//---------------------------------------------------------

#pragma endregion AutogeneratedMethods

// En esta región se implementan los métodos sin interés semántico que no
// fueron declarados en Rosette. El contenido de esta región se mantendrá
// entre generaciones.
#pragma region UserImpSpace

#pragma endregion UserImpSpace
} // namespace Logic

